package Hot_100;

import java.util.HashMap;

/*
    给定一个罗马数字，将其转换成整数。
    https://leetcode.cn/problems/roman-to-integer/

    999 应该写作 CM XC IX
*/
public class T13_romanToInt {
    public static void main(String[] args) {
        int num = romanToInt_2("III");
        System.out.println(num);
    }


//    解2
    static int romanToInt_2(String s) {
        HashMap<String, Integer> map = new HashMap<>();
        map.put("M",1000 );
        map.put("D", 500);
        map.put("C", 100);
        map.put("L", 50);
        map.put("X", 10);
        map.put("V",5 );
        map.put("I", 1);

        int ans=0;
        char[] charArray = s.toCharArray();
        for (int i = 0; i < charArray.length; i++) {
            if (i+1 < charArray.length && map.get(charArray[i]+"") < map.get(charArray[i + 1]+"")) { //如果出现左边的罗马值小于右边的，就相对于取负数
                ans-=map.get(charArray[i]+"");
            }else{
                ans+=map.get(charArray[i]+"");
            }
        }
        return ans;
    }



//    对解1进行优化
    static int romanToInt_3(String s) {
        int[] keys = {     1000, 900, 500, 400, 100,  90,   50,  40,   10,   9,   5,    4,    1};
        String[] values = {"M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I"};

        HashMap<String, Integer> map = new HashMap<>();
        map.put("M",1000 );
        map.put("CM", 900);
        map.put("D", 500);
        map.put("CD", 400);
        map.put("C", 100);
        map.put("XC", 90);
        map.put("L", 50);
        map.put("XL", 40);
        map.put("X", 10);
        map.put("IX", 9);
        map.put("V",5 );
        map.put("IV",4 );
        map.put("I", 1);

        int num=0;

        for (int i = 0; i < s.length(); ) {
            if (i+1<s.length() && map.containsKey(s.substring(i, i + 2))) {
                num+=map.get(s.substring(i, i + 2));
                i+=2;
            }else {
                num+=map.get(s.charAt(i)+"");
                i++;
            }
        }

        return num;
    }


//    解1
    static int romanToInt(String s) {
        int[] keys = {     1000, 900, 500, 400, 100,  90,   50,  40,   10,   9,   5,    4,    1};
        String[] values = {"M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I"};

        HashMap<String, Integer> map = new HashMap<>();
        map.put("M",1000 );
        map.put("CM", 900);
        map.put("D", 500);
        map.put("CD", 400);
        map.put("C", 100);
        map.put("XC", 90);
        map.put("L", 50);
        map.put("XL", 40);
        map.put("X", 10);
        map.put("IX", 9);
        map.put("V",5 );
        map.put("IV",4 );
        map.put("I", 1);


        int num=0;
        char[] charArray = s.toCharArray();

        for (int i = 0; i < charArray.length; ) {
            if (i+1<charArray.length&&charArray[i] == 'C' && charArray[i + 1] == 'M') {
                num+=900;
                i+=2;
            }
            else if (i+1<charArray.length&&charArray[i] == 'C' && charArray[i + 1] == 'D') {
                num+=400;
                i+=2;
            }
            else if (i+1<charArray.length&&charArray[i] == 'X' && charArray[i + 1] == 'C') {
                num+=90;
                i+=2;
            }
            else if (i+1<charArray.length&&charArray[i] == 'X' && charArray[i + 1] == 'L') {
                num+=40;
                i+=2;
            }
            else if (i+1<charArray.length&&charArray[i] == 'I' && charArray[i + 1] == 'X') {
                num+=9;
                i+=2;
            }
            else if (i+1<charArray.length&&charArray[i] == 'I' && charArray[i + 1] == 'V') {
                num+=4;
                i+=2;
            }else {
                num += map.get(charArray[i]+"");
                i++;
            }
        }
        return num;
    }
}
